const Crypto = require( './crypto.js' );

( function () {

	// Shortcut
	var util = Crypto.util

	Crypto.HMAC = function ( hasher, message, key, options ) {

		// Allow arbitrary length keys
		key = key.length > hasher._blocksize * 4 ?
			hasher( key, { asBytes: true } ) :
			util.stringToBytes( key )

		// XOR keys with pad constants
		var okey = key,
			ikey = key.slice( 0 )
		for ( var i = 0; i < hasher._blocksize * 4; i++ ) {
			okey[ i ] ^= 0x5C
			ikey[ i ] ^= 0x36
		}

		var hmacbytes = hasher( util.bytesToString( okey ) +
			hasher( util.bytesToString( ikey ) + message, { asString: true } ), { asBytes: true } )
		return options && options.asBytes ? hmacbytes :
			options && options.asString ? util.bytesToString( hmacbytes ) :
			util.bytesToHex( hmacbytes )
	}

} )()

module.exports = Crypto
